package risoe.syslab.fhnew.db;

/*
 * Copyright (c) 2012-2014, Technical University of Denmark (DTU)
 * All rights reserved.
 * 
 * The Flexhouse 2.0 platform ("this software") is licensed under the
 * BSD 3-clause license.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   - Neither the name of DTU nor the names of its contributors may be used to
 *     endorse or promote products derived from this software without specific
 *     prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE TECHNICAL UNIVERSITY OF DENMARK BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.text.DecimalFormat;
import java.util.ArrayList;
import risoe.syslab.db.simpledb.AbstractDBWriter;
import risoe.syslab.fhnew.hw.Actuator;
import risoe.syslab.fhnew.hw.ProcessImage;
import risoe.syslab.fhnew.hw.Sensor;
import risoe.syslab.model.CompositeData;

public class NumericalLogger extends AbstractDBWriter {

  private static final String FILEPREFIX="house-";
  private String[] colHeaders;
  private DecimalFormat[] colFormats;
  private ProcessImage procimg;
  private CompositeData[] rv;
  private boolean running;
  private String error;

  public NumericalLogger(ProcessImage pi) {
    super();
    procimg=pi;
    
    ArrayList<String> columns=new ArrayList<String>();
    ArrayList<DecimalFormat> formats=new ArrayList<DecimalFormat>();
    Sensor[] sens=pi.getSensors();
    for (Sensor s:sens) {
      columns.add("S_"+s.getName()+"["+s.getUnit()+"]");
      formats.add(THREEDECIMALS);
    }
    Actuator[] actu=pi.getActuators();
    for (Actuator a:actu) {
      columns.add("A_"+a.getName()+"_s["+a.getUnit()+"]");
      columns.add("A_"+a.getName()+"_v["+a.getUnit()+"]");
      formats.add(THREEDECIMALS);
      formats.add(THREEDECIMALS);
    }
    
    colHeaders=new String[columns.size()];
    colHeaders=columns.toArray(colHeaders);
    colFormats=new DecimalFormat[formats.size()];
    colFormats=formats.toArray(colFormats);
    rv=new CompositeData[colHeaders.length];
  }
  
  public String start(int i, int r, String path) {
    String rv=super.start(i,r,path);
    if (rv==null) {
      running=true;
      error="";
    }
    else {
      running=false;
      error=rv;
    }
    return rv;
  }
  
  public void stop() {
    super.stop();
    running=false;
    error="";
  }
  
  public boolean isRunning() {
    return running;
  }
  
  public String getErrorString() {
    return error;
  }
  
  @Override
  protected String getFilePrefix() {
    return FILEPREFIX;
  }

  @Override
  protected String[] getHeaderFields() {
    return colHeaders;
  }
  
  @Override
  protected DecimalFormat[] getColumnFormats() {
    return colFormats;
  }

  @Override
  protected CompositeData[] getData() {
    Sensor[] sens=procimg.getSensors();
    int writePtr=0;
    for (Sensor s:sens) {
      rv[writePtr++]=s.getValue();
    }
    Actuator[] actu=procimg.getActuators();
    for (Actuator a:actu) {
      rv[writePtr++]=a.getSetpoint();
      rv[writePtr++]=a.getValue();
    }
    return rv;
  }
}
